package edu.nuc.ahm.juc.forkjoin;

import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/*
* 求和计算的任务
* 3000 6000（ForkJoin） 9000（Stream并行流）
* 如何使用 forkJoin
* // 第一步 forkJoinPool 通过它来执行
* // 第二步
* */
public class ForkJoinDemo extends RecursiveTask<Long> {

    private Long start;  // 1
    private Long end;   // 19000000000990

    private Long temp = 10000L;

    public ForkJoinDemo(Long start,Long end){
        this.start = start;
        this.end = end;
    }


    public void test(){
        if(end-start>temp){
           // 分支合并计算

        }else {

        }
    }

    public static void main(String[] args) {

    }
   // 计算方法   RecursiveTask<Long> {
    @Override
    protected Long compute() {
        if ((end-start)<temp){

            Long sum =0L;
            for (Long i = start; i <=end; i++) {
                sum+=i;
            }
           return sum;
        }else {
            //合并分支计算 forkjoin 递归
            //
            Long middle = (start + end) / 2;
            ForkJoinDemo task1 = new ForkJoinDemo(start, middle);// 成为一个任务了
            task1.fork();// 拆分任务 把任务压入线程
            ForkJoinDemo task2 = new ForkJoinDemo(middle+1, end);// 成为一个任务了
            task2.fork();
            return task1.join()+task2.join();

        }
    }
}
